查看原文
其他

号称取代初级工程师的Devin

renee创业狗 Renee 创业随笔
2024-10-09

4天前,Cognition Lab发布了Devin,号称首个AI软件工程师。

Devin是SWE-Bench编码基准测试中的最新技术水平,已经成功通过了顶尖AI公司的实际工程面试,并且甚至在Upwork上完成了真实的工作。Devin是一个自主代理,通过使用自己的shell、代码编辑器和网络浏览器解决工程任务。

Devin的能力

凭借我们在长期推理和规划方面的进展,Devin能够规划和执行需要成千上万决策的复杂工程任务。Devin可以在每一步回忆相关上下文,随时间学习,并修正错误。

我们还为Devin配备了常见的开发工具,包括shell、代码编辑器和浏览器,这一切都在一个沙盒计算环境中——一切人类完成工作所需的工具。

最后,我们赋予了Devin与用户积极协作的能力。Devin可以实时报告进展,接受反馈,并在需要时与您共同进行设计选择。

能做的一些示例

  • Devin可以学习如何使用不熟悉的技术。在阅读博客文章后,Devin在Modal上运行ControlNet,为Sara生成含有隐藏信息的图像。
  • Devin可以端到端构建和部署应用。Devin创建了一个模拟生命游戏的交互式网站!它逐步添加用户请求的功能,然后将应用部署到Netlify。
  • Devin可以自主地找到并修复代码库中的错误。Devin帮助Andrew维护和调试他的开源竞赛编程书籍。
  • Devin可以训练和微调自己的AI模型。Devin仅给定GitHub上一个研究仓库的链接,就设置了大型语言模型的微调。
  • Devin可以处理开源仓库中的错误和功能请求。只需一个GitHub问题链接,Devin就完成了所有必要的设置和上下文收集。
  • Devin可以为成熟的生产仓库做出贡献。这个示例是SWE-bench基准测试的一部分。Devin解决了sympy Python代数系统中对数计算的错误。Devin设置代码环境,复现错误,并独立编写和测试修复方案。
  • 让Devin在Upwork上承接真实工作,它也能胜任!这里,Devin编写和调试代码来运行计算机视觉模型。

Devin的性能

我们在SWE-bench上评估了Devin,这是一个要求代理解决在开源项目(如Django和scikit-learn)中发现的真实世界GitHub问题的挑战性基准。

Devin端到端正确解决了13.86%的问题,远远超过了之前1.96%的最佳水平。即使给定了确切需要编辑的文件,之前最好的模型也只能解决4.80%的问题。

Devin在数据集随机25%的子集上进行了评估。Devin是无人协助的,而所有其他模型都是有协助的(意味着模型被明确告知哪些文件需要编辑)。

SWE-bench技术报告

昨天,Cognition又发布了一份技术报告,对Devin进行了更详细的介绍。为了评估Devin,Cognition使用了SWE-bench,这是一个由GitHub问题和拉取请求组成的软件工程系统自动化基准测试。SWE-bench通过单元测试确定性地评估系统解决现实世界代码库中问题的能力,不同于HumanEval等仅限于独立函数的基准测试。

SWE-bench是从GitHub上流行的开源Python仓库中抓取的2,294个问题和拉取请求的数据集。它的目标是测试系统编写现实世界代码的能力。每个SWE-bench实例由一个GitHub问题和解决它的拉取请求组成。拉取请求必须包括一个单元测试,该测试在代码更改之前失败,在之后通过(称为“失败到通过”测试)。diff被分成两部分,patch和test_patch,分别包含代码更改和测试更改。然后,系统被要求根据GitHub问题描述和问题当时的仓库(repository)生成一个diff。如果所有单元测试在应用修改后通过,则认为示例成功。

在SWE-bench中,LLMs要么被给定一组正确的文件来编辑(“协助”),要么一个单独的系统基于问题文本的相似性检索要编辑的文件(“无人协助”)。作为一个代理,Devin没有接收任何文件列表,而是自行导航文件,这更类似于“无人协助”的LLM。正确解决SWE-bench示例是具有挑战性的。较难的PR需要更改数十个文件、保持向后兼容性,并/或进行大量复杂的推理。即使在协助下,最好的LLM也只达到了4.80%的成功率。

分析

多步骤规划

Devin能够执行多步骤计划以从环境中获取反馈。72%的通过测试需要超过10分钟才能完成,迭代的能力帮助Devin取得成功。

定性示例

示例1: ✅ scikit-learn__scikit-learn-10870

Devin最初被描述迷惑,并按照描述字面添加了self.lower_bound_ = max_lower_bound,然后返回self。这实际上是不正确的,因为变量尚未定义。

作为问题描述中提供的测试代码,Devin接着更新测试文件:

但在运行测试并接收到错误后,Devin纠正了文件:

完成这次修正后,Devin重新运行测试使之通过,并成功退出。

这个例子有几个有趣的点:

  • Devin非常严格地遵循原始问题的指示,尽管这些指示不准确。这表明了与用户偏好的过度对齐。 

  • Devin能够在其环境中运行测试并纠正错误。软件开发人员能够迭代至关重要,代理也应该能够做同样的事情。

示例2: ✅ django__django-10973

Devin识别出正确的文件django/db/backends/postgresql/client.py,并完成了完整的编辑:

这里,Devin能够成功修改大量代码。SWE-bench中许多成功的编辑由单行diff组成,但Devin能够同时处理多行。

示例3: ❌ sympy__sympy-17313

这是一个涉及修改计算机代数系统以正确处理关于可指定为正或负的值的floor和ceiling对象上的比较运算符的困难任务。这需要复杂的逻辑推理和多个推导步骤。

Devin未能编辑正确的类,错误地编辑了frac类而不是floor类和ceiling类。而且,Devin只编辑了一个比较运算符__gt__,当需要修改__lt__、__le__和__ge__时。这次编辑远远未能正确。

正确的diff可以在这里找到:https://github.com/sympy/sympy/pull/17313/files。diff相当复杂,包含许多边缘案例处理和大量的单元测试,需要深入理解sympy代码库。(注意,要通过SWE-bench实例,必须每一个测试都通过。)

示例4: ❌ scikit-learn__scikit-learn-10774

这个任务涉及为仓库中所有数据集添加额外的返回选项功能。Devin成功为几个数据集做了这样的编辑;下面展示了一个示例。

Devin成功为数据集california_housing.py、covtype.py、kddcup99.py和mldata.py进行了类似的编辑(实际上原始PR排除了这些)。不幸的是,Devin漏掉了两个数据集lfw.py和rcv1.py,所以最终测试失败。Cognition团队计划提高Devin编辑多个文件的能力。

测试驱动的实验

Cognition进行了一个额外的实验,在这个实验中,提供了最终的单元测试和问题陈述给Devin。在这种“测试驱动开发”设置中,成功通过率提高到了23%(在100个采样测试中)。(请注意,任何对测试本身的更改在评估前都被擦除。)

尽管代理能够访问基础真理测试补丁,这个结果与SWE-bench的其他结果不可比。然而,测试驱动开发是软件工程中的常见模式,因此这种设置是SWE-bench的自然扩展。人类工程师和代理协作的自然方式是给代理一个目标测试来通过,期待将来会有更多测试驱动的代理。

解决测试问题的新示例

✅ django__django-13321: Devin通过在函数前添加一个打印声明,然后运行单元测试,再根据打印结果编辑文件解决了这个问题。测试用例的存在让Devin更容易调试。

✅ django__django-16983: 新的单元测试断言发出了一个确切的错误消息:“'filter_horizontal[0]'的值不能包括[…]”。没有测试补丁,不可能通过测试,这凸显了基准测试的一个问题,并表明没有测试补丁就不可能得到完美分数。

继续滑动看下一个
Renee 创业随笔
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存